﻿using GDM.Hogar.Aplicacion.Properties;
using GDM.Hogar.Entidades;
using GDM.Hogar.Entidades.Enums;
using GDM.Hogar.Managers.Contratos;
using GDM.Hogar.Soporte.Helpers;
using System;
using System.Linq;
using System.Windows.Forms;

namespace GDM.Hogar.Aplicacion.Formularios.Agentes
{
    public partial class FrmConsultaAgentes
#if DEBUG
 : FrmConsultaAgente
#else
     : FrmConsulta<ConsultaAgente>
#endif
    {
        private readonly IAgenteManager _agenteManager;
        private readonly IPuestoManager _puestoManager;
        private FrmAgente _frmCrearAgente;
        private FrmAgente _frmEditarAgente;

        private bool EsAdministrativo
        {
            get { return ContextoUsuario.RolId == (int)Rol.Administrativo; }
        }

        #region Public Methods

        public FrmConsultaAgentes(IAgenteManager agenteManager, IPuestoManager puestoManager)
        {
            if (agenteManager == null)
                throw new ArgumentNullException("agenteManager");
            if (puestoManager == null)
                throw new ArgumentNullException("puestoManager");

            _agenteManager = agenteManager;
            _puestoManager = puestoManager;
            InitializeComponent();
        }

        #endregion Public Methods

        #region Private Methods

        protected override void CrearRegistro()
        {
            _frmCrearAgente = AbrirFormularioModal(_frmCrearAgente, action: frm => frm.OnAgenteCreado = RefrescarGrilla);
        }

        protected override void EditarRegistro(ConsultaAgente agente)
        {
            _frmEditarAgente = AbrirFormularioModal(_frmEditarAgente, action: frm =>
            {
                frm.Agente = agente;
                frm.OnAgenteActualizado = RefrescarGrilla;
            });
        }

        protected override void EliminarRegistro(ConsultaAgente agente)
        {
            try
            {
                //- desactivar agente en bd
                _agenteManager.ActivarAgente(agente.AgenteId, false);
                Datos.First(a => a.AgenteId == agente.AgenteId).Activo = false;
                btnBuscar_Click(null, null);
                MostrarMensajeExito(Resources.Agente_EliminadoConExito);
            }
            catch (Exception ex)
            {
                MostrarMensajeError(Resources.EliminarAgente_Error);
            }
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            dgAgentes.Search(Datos.AsQueryable(), CriterioDeBusqueda);
        }

        private void btnQuitarFiltro_Click(object sender, EventArgs e)
        {
            LimpiarControl(gbFiltros);
            btnBuscar_Click(null, null);
        }

        private void CargarAgentes()
        {
            Datos = _agenteManager.ObtenerAgentes();
            InicializarGrilla(dgAgentes, a => a.Activo);
            //btnCambioHorario.Enabled = mostrar;
            //btnFranco.Enabled = mostrar;
        }

        private void CargarAreas()
        {
            cmbAreas.Items.Add("");
            foreach (var item in Enum.GetValues(typeof(Area)))
            {
                cmbAreas.Items.Add(item);
            }
            cmbAreas.SelectedIndex = 0;
        }

        private void CargarPuestos()
        {
            cmbPuestos.CargarItems(_puestoManager.ObtenerPuestos(), "Descripcion", "PuestoId", true);
        }

        private void ckbActivos_CheckedChanged(object sender, EventArgs e)
        {
            dgAgentes.UserCanDelete = EsAdministrativo && ckbActivos.Checked;
            dgAgentes.ReadOnlyMode = !EsAdministrativo || !ckbActivos.Checked;
            //btnCambioHorario.Enabled = ckbActivos.Checked;
            //btnFranco.Enabled = ckbActivos.Checked;
            btnBuscar_Click(null, null);
        }

        private bool CriterioDeBusqueda(ConsultaAgente agente)
        {
            var criterio = agente.Activo == ckbActivos.Checked;
            if (!txtDni.Text.EsVacio()) criterio = criterio && agente.Dni.Contiene(txtDni.Text);
            if (!txtNombre.Text.EsVacio()) criterio = criterio && agente.Nombre.ToLower().Contiene(txtNombre.Text.ToLower());
            if (!txtApellido.Text.EsVacio()) criterio = criterio && agente.Apellido.ToLower().Contiene(txtApellido.Text.ToLower());
            if (cmbAreas.SelectedIndex > 0)
            {
                criterio = criterio && agente.AreaId == (int)cmbAreas.SelectedItem;
            }
            if (cmbPuestos.SelectedIndex > 0)
                criterio = criterio && agente.Puesto == ((Puesto)cmbPuestos.SelectedItem).Descripcion;

            return criterio;
        }

        private void FrmConsultaAgentes_Load(object sender, EventArgs e)
        {
            CargarAreas();
            CargarPuestos();
            dgAgentes.UserCanAdd = EsAdministrativo;
            dgAgentes.UserCanDelete = EsAdministrativo;
            dgAgentes.ReadOnlyMode = !EsAdministrativo;
            CargarAgentes();
            txtDni.Focus();
            //btnCambioHorario.Visible = EsAdministrativo;
            //btnFranco.Visible = EsAdministrativo;
            ttInfo.SetToolTip(btnQuitarFiltro, "Quitar filtro");
        }

        private void RefrescarGrilla()
        {
            Datos = _agenteManager.ObtenerAgentes();
            btnBuscar_Click(null, null);
        }

        #endregion Private Methods
    }
}